home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
COMAL
/
A-COMAL Series
/
(k)aaj.d64
/
src.matrix
< prev
next >
Wrap
Text File
|
2007-02-28
|
4KB
|
301 lines
;.LIB C64SYB
ARRAY=6
DEFPAG=$46
ENDPRC=$7E
REAL=0
PROC=$70
REF=$75
RUNERR=$C9FB
COPY1=$45
COPY2=$47
COPY3=$49
AC1=$61
AC1M3=$64
AC1M4=$65
INTFP=$C992
FNDPAR=$C896
FPADD=$C8AB
FPINT=$C977
FPMUL=$C8CC
FSBLK=$BE
MYCH=$BF
LDAC1=$C890
POPA1=$C9AA
PUSHA1=$C9BC
STAC1=$C8F6
;
.MAC MOVEW
LDA ?2+1
LDX ?2
STA ?1+1
STX ?1
.MND
;
.MAC DBTOW
LDA ?2
LDX ?2+1
STA ?1+1
STX ?1
.MND
;
*=$8009 ; START OF MODULE
.BYTE DEFPAG
.WORD MODEND
.WORD SENSER
; PACKAGE: MATRIX
.BYTE 6,'MATRIX'
.WORD PNAME
.WORD SINIT
.BYTE 0
;PROCEDURE NAME TABLE
PNAME .BYTE 7,'MATMULT'
.WORD PHEAD
.BYTE 0
;PROCEDURES:
PHEAD .BYTE PROC
.WORD MMCODE
.BYTE 3
.BYTE REF+ARRAY+REAL,2
.BYTE REF+ARRAY+REAL,2
.BYTE REF+ARRAY+REAL,2
.BYTE ENDPRC
SENSER ; NO SENSING REQ'D
SINIT RTS ; NO INIT. REQ'D
;RESERVE VARIABLE SPACE
ASTART *=*+2
APOINT *=*+2
BBASE *=*+2
CPOINT=FSBLK ; ZERO PAGE FOR ( ),Y IN INITIALIZING SUMS TO 0.
NTOP *=*+2
ONUM *=*+2
BTOP *=*+2
CTOP *=*+2
BSTART *=*+6
BPOINT=BSTART+2
;
;// INDEX RANGE SUBROUTINE
;
RANGER LDA (COPY1),Y
SEC
DEY
DEY
SBC (COPY1),Y
TAX
INY
LDA (COPY1),Y
DEY
DEY
SBC (COPY1),Y
DEY
RTS
;
;// MATMULT
;
MMCODE CLD
LDA #1
JSR FNDPAR ;FIND 1ST ARRAY TABLE
LDY #10
JSR RANGER ;GET N-1
STA NTOP ; N-1
STX NTOP+1
JSR RANGER ;GET M-1
STA CTOP ;TEMP M-1 TIL COMPARE 2ND M-1 VALUE AND TIL COMPUTE CTOP
STX CTOP+1
DEY ;SKIP # OF DIMENSIONS
LDA (COPY1),Y
STA ASTART
DEY
LDA (COPY1),Y
STA ASTART+1
LDA #$02
JSR FNDPAR
LDY #10
JSR RANGER ;GET O-1
STA ONUM ; HI
JP1 STX ONUM+1
JSR RANGER ;GET 2ND VERSION N
CPX NTOP+1
BEQ OK1
ERR64 LDX #64 ;DIMENISION MISMATCH
JMP RUNERR
OK1 CMP NTOP
BNE ERR64
DEY
LDA (COPY1),Y
STA BBASE
DEY
LDA (COPY1),Y
STA BBASE+1
LDA #3
JSR FNDPAR ;FIND 3RD ARRAY TABLE
LDY #10
JSR RANGER ;2ND VERSION OF O-1
CMP ONUM
BNE ERR64
CPX ONUM+1
BNE ERR64
INC ONUM+1
BNE JP2
INC ONUM
JP2 JSR RANGER ;2ND VERSION OF M
CPX CTOP+1
BNE ERR64
CMP CTOP
BNE ERR64
DEY
LDA (COPY1),Y
STA CPOINT+1
DEY
LDA (COPY1),Y
STA CPOINT
;
;COMPUTE BTOP AND CTOP
;
LDA #0
LDY #5
JSR INTFP ;5 BYTES PER REAL #
LDX #<BSTART ;START OF FP # TEMP AREA
LDY #>BSTART
JSR STAC1 ;STORE 5
LDA ONUM
LDY ONUM+1
JSR INTFP
LDA #<BSTART
LDY #>BSTART
JSR FPMUL ;5 X ONUM
JSR PUSHA1
LDX #<BSTART
LDY #>BSTART
JSR STAC1
JSR POPA1
JSR FPINT
LDA AC1M4
STA ONUM+1 ;LO
LDA AC1M3
STA ONUM ;HI
LDY CTOP+1 ;LO BYTE OF M-1
INY ;NEED M
BNE JP3
INC CTOP
JP3 LDA CTOP
JSR INTFP
LDA #<BSTART
LDY #>BSTART
JSR FPMUL ;5 X ONUM X M
JSR FPINT
LDA AC1M4
CLC
ADC CPOINT
STA CTOP+1
LDA AC1M3
ADC CPOINT+1
STA CTOP ;5 X ONUM X M + 1ST OF ANSWER ARRAY =1ST PAST ANSWER ARRAY
;DO REST OF BTOP
LDA NTOP+1 ;LO
CLC
ADC #$02
TAY
LDA NTOP ;HI
ADC #$00
JSR INTFP ; N+1
LDA #<BSTART
LDY #>BSTART
JSR FPMUL ;5 X ONUM X (N+1)
JSR FPINT
LDA AC1M4
CLC
ADC BBASE+1
TAY
LDA BBASE
ADC AC1M3
TAX ;5 X ONUM X (N+1) + 1ST OF B ARRAY =1 PAST B ARRAY + A ROW
TYA
SEC
SBC #$05
STA BTOP+1
BCS JP4
DEX
JP4 STX BTOP
SEC
SBC ONUM+1
STA NTOP+1
TXA
SBC ONUM
STA NTOP
;
;INITIALIZING DONE. DO MATMULT.
;
JLOOP MOVEW BSTART:BBASE
KLOOP MOVEW BPOINT:BSTART
MOVEW APOINT:ASTART
LDA #0
TAY
STA (CPOINT),Y ;ZERO CURRENT ELEMENT OF C(,) BEFORE SUMMING PRODUCTS
LLOOP LDA BPOINT+1 ;LO
LDY BPOINT ;HI
JSR LDAC1
LDA APOINT+1
LDY APOINT
JSR FPMUL
;
;ROUND HERE TO DUPLICATE ANSWERS OF PROCEDURE IN COMAL
LDX <AC1
LDY >AC1
JSR $CAA0 ;STORE AC1 AT AC1 TO FORCE ROUNDING
LDA AC1+1
ORA #$80
STA AC1+1 ;FIX WHOLE PART OF MANTISSA-- ALWAYS 1 IN BINARY!
;1ST 36 BYTES AT $CAA0 OR SIMILAR COULD BE USED: 23 BYTES LONGER
;
LDA CPOINT
LDY CPOINT+1
JSR FPADD
LDX CPOINT
LDY CPOINT+1
JSR STAC1
CLC
LDA #5
ADC APOINT+1 ;NEXT ELEMENT OF A(,)
STA APOINT+1
BCC JP6
INC APOINT
JP6 CLC
LDA BPOINT+1 ;NEXT ELEMENT OF B(,)
ADC ONUM+1
STA BPOINT+1
LDA BPOINT
ADC ONUM
STA BPOINT
LDA NTOP+1
CMP BPOINT+1
LDA NTOP
SBC BPOINT
BCS LLOOP
LDA #5
CLC
ADC CPOINT
STA CPOINT
BCC JP8
INC CPOINT+1
JP8 LDA CPOINT
CMP CTOP+1
LDA CPOINT+1
SBC CTOP
BCC JP9
RTS ;ANSWER ARRAY IS FILLED
JP9 LDA #5
ADC BSTART+1
STA BSTART+1
BCC JP10
INC BSTART
JP10 LDA BPOINT+1
CMP BTOP+1
LDA BPOINT
SBC BTOP
BCS JP11
JMP KLOOP
JP11 MOVEW ASTART:APOINT
JMP JLOOP
MODEND =*
.END